package czStvDpds.centrallogic;

import czStvDpds.input.LWJGLKeyEvent;
import czStvDpds.input.LWJGLKeyListener;
import czStvDpds.input.LWJGLMouseEvent;
import czStvDpds.input.LWJGLMouseListener;
import menu.PausedGameMenu;

/**
 * Přijíma eventy od různých částí programu, dekóduje je a posílá je podle
 * jejich typu dál.
 *
 * Použití: Grafika/GUI si vytvoří svou vlastní instanci EventAbsorberu a přídá
 * její třídy KeyListener a MouseListener jako listenery oknu/tlačítku apod.
 *
 * @author Jirka, Vašek
 */
public class EventAbsorber implements LWJGLKeyListener, LWJGLMouseListener {

    int lX, lY; //Poslední pozice myší (l = last)
    static final double rotSpeed = 2; //Rychlost otáčení
    Logic logic;

    public EventAbsorber(Logic logic) {
        this.logic = logic;
    }

    @Override
    public void mouseAction(LWJGLMouseEvent e) {
        // Dekódovat druh pohybu myši z eventy a určit podle jejího typu co
        // za metodu se má zavolat

        if (logic.isCameraFree()) {
            logic.rotateCamera(e.getdX(), e.getdY());
        } else {
//            int rX = e.getX() - lX; //Relativní x
//            int rY = e.getY() - lY; //Relativní y, zatím nepoužité (bude otáčet kamerou nahoru a dolů)
            int rX = e.getdX(); //Relativní x
            int rY = e.getdY(); //Relativní y, zatím nepoužité (bude otáčet kamerou nahoru a dolů)
            PlayerMovement m = new PlayerMovement(0, 0, 0, rX, true);
            logic.movePlayer(m);

            if (e.getButtonState() == true && e.getButton() == 0) {
                logic.shoot();
            }
        }
    }

    @Override
    public void keyAction(LWJGLKeyEvent e) {
        // Dekodovát druh klavesy z eventu a určit podle jejího typu co
        // za metodu se má zavolat
        switch (e.getKey()) {
            case LWJGLKeyEvent.KEY_F11:
                if (e.getState() == true) {
                    logic.toggleCursor();
                }
                break;
            case LWJGLKeyEvent.KEY_F12:
                if (e.getState() == true) {
                    logic.toggleLIA();
                }
                break;
            case LWJGLKeyEvent.KEY_ESCAPE:
                if (e.getState() == true) {
//                    logic.toggleGUIGameMenu();
                    PausedGameMenu.toggleVisibility();
                }
                break;
        }
        if (logic.isCameraFree()) {
            switch (e.getKey()) {
                case LWJGLKeyEvent.KEY_W:
                    if (e.getState()) {
                        logic.moveCamera(1);
                    }
                    break;
                case LWJGLKeyEvent.KEY_S:
                    if (e.getState()) {
                        logic.moveCamera(-1);
                    }
                    break;
            }
        } else {
            PlayerMovement m = null;
            switch (e.getKey()) {
                case LWJGLKeyEvent.KEY_W:
                    m = new PlayerMovement(0, Direction.FORWARD);
                    toggleDirection(Direction.FORWARD, e);
                    break;
                case LWJGLKeyEvent.KEY_S:
                    m = new PlayerMovement(0, Direction.BACK);
                    toggleDirection(Direction.BACK, e);
                    break;
                case LWJGLKeyEvent.KEY_A:
                    m = new PlayerMovement(0, Direction.LEFT);
                    toggleDirection(Direction.LEFT, e);
                    break;
                case LWJGLKeyEvent.KEY_D:
                    m = new PlayerMovement(0, Direction.RIGHT);
                    toggleDirection(Direction.RIGHT, e);
                    break;
            }
        }
        //logic.movePlayer(m); //Vypnuto - starý systém. Jeho zbytek jsem nemazal pro jednodušší reaktivaci

    }

    private void toggleDirection(Direction d, LWJGLKeyEvent e) { //Pomocná metoda na zkrácení kódu
        logic.toggleDirection(d, e.getState());
    }
    // Zde bude také příjem vstupu od síťe, bude se muset ještě pořádně domluvit
    // se sítí jak to teda bude (případně implementovat listenery a eventy pro
    // události na síti)
}